#ifndef FUNC
#define FUNC

/* #define DEBUG */

/**
 * struktura przechowujaca dane wprowadzone z lini kommend
 */
typedef struct {
	char* filePath; 	/* sciezka do pliku */
	char sourceChar; 	/* znak ktory bedzie zastepowany */
	char targetChar; 	/* znak docelowy */
} INPUT;

/**
 * struktura przechowujaca dane o zmapowanym w pamieci pliku
 */
typedef struct {
	void* mapped; 		/* wskaznik do pliku w pamieci */
	long int size; 		/* rozmiar pliku*/
	int error;			/* czy wystapil blad podczas mapowania pliku do pamieci */
} MAPPED_FILE;


/*
 * Wypisuje na ekran informacje o agrumentach i sposobie uzycia programu
 *  programName - nazwa programu
 */
int PrintUsage(char* programName);

/*
 * Waliduje argumenty wejsciowe i zwraca :
 * 		0 - w przypadku prawidlowych danych
 * 		1 - w przypadku blednych danych
 */
int ValidateInput(int argc, char* argv[]);

/*
 * Parsuje argumety programu i zwarca strukture z danymi
 * 	argv - agrumety programu
 */
INPUT ParseInput(char* argv[]) ;


/*
 * Otwiera plik i zwraca deskryptor do niego, zwraca -1 w przypadku wystapienia bledu
 *  filePath - sciezka do pliku
 */
int OpenFile(char* filePath);

/*
 * Zwraca rozmiar pliku z danego deskryptora, -1 w przypadku wystapienia bledu
 *  fileDescriptor - deskryptor pliku
 */
int GetFileSize(int fileDescriptor);

/*
 * Zwraca adres do zmapowanego pliku w pamieci, -1 w przypadku wystapienia bledu
 *  fileDescriptor - deskryptor pliku
 *  fileSize - rozmiar pliku
 */
void* GetMappedFileAddress(int fileDescriptor, int fileSize);

/*
 * Zwraca strukture ze zmapowanym plikiem,  pole MAPPED_FILE.error przyjmuje wartosci :
 * 		 0 - w przydku poprawnego zmapowania pliku
 * 		 1 - w przypadku wystapienia bledu
 *  filePath - sciezka do pliku
 */
MAPPED_FILE MapFile(char* filePath);

/*
 * Zastepuje w tekscie znaki 'source' znakami 'target'
 *  text - tekst w ktorym beda zastepowane znaki
 *  source - zastepowany znak
 *  target - docelowy znak
 */
void Replace(char* text, char source, char target);

/*
 * Synchronizuje zmapowany plik i odmapowuje go
 *  mappedFile - struktura ze zmapowanym plikiem
 */
void SyncFile(MAPPED_FILE mappedFile);

#endif
